/* 1、当我们点击按钮的时候动态给 data 增加的成员是否是响应式数据，如果不是的话，如何把新增成员设置成响应式数据，它的内部原理是什么。

答：不是响应式数据。因为动态给data添加的成员，已经错过了数据劫持，添加发布订阅事件的时机。
我们可以手动调用Vue.util.definereactive方法,手动为该成员注册监听事件。
其内部原理就是通过调用Vue.util.definereactive方法，通过Object.defineProperty方法，劫持该属性的setter，getter方法，
在getter方法中，为该属性创建一个Dep对象，收集依赖watcher，
在setter方法中，通过Dep通知依赖watcher进行更新视图。
*/


/*2、请简述 Diff 算法的执行过程
答：Diff算法的核心原则是是仅比较同级节点。
当在进行同级节点的比较时，会分别为新旧虚拟节点设置开始索引，结束索引，先简称为老的开始：os，老的结束：oe,新的开始ns,新的结束：ne
比较的时候优先四个原则，
即先比较os上的节点和ns上的节点是否一致，一致的标志是指vnode的key或sel相同。如果一致，则os和ns分别+1, 真实dom节点顺序不用更新，仅更新内容
否则再比较oe上的节点和ne上的节点是否一致，如果一致，则oe和ne分别-1, 真实dom节点顺序不用更新，仅更新内容
否则再比较os上的节点和ne上的节点是否一致，如果一致，则os +1, ne -1,同时，将os对应真实的dom节点移到ne对应的顺序上，删除老的dom节点，同时更新内容
否则再比较oe上的节点和ns上的节点是否一致，如果一致，则oe -1, ns +1,同时，将oe对应真实的dom节点移到ns对应的顺序上，删除老的dom节点，同时更新内容
以上情况都不满足的情况下，则又会分为两种情况。
如果新旧子节点都存在key，那么会根据oldChild的key生成一张hash表，用ns的key与hash表做匹配，匹配成功就判断ns和匹配节点是否为相同节点，如果是，就在真实dom中将成功的节点移到最前面，
否则，将S生成对应的节点插入到dom中对应的oldS位置，S指针向中间移动，被匹配old中的节点置为null。
如果没有key,则直接将NS生成新的节点插入真实DOM

新旧两个虚拟节点列表，哪个的开始索引先大于结束索引，就代表结束。
如果老的vnode列表先结束，则代表有新增的节点，则将新vnode列表未用到的节点，追加到真实dom中
如果新的vnode列表先结束，则代表有删除的节点，则将新老的vnode列表多余的节点对应的dom节点，进行删除。
*/


/*
代码题地址：https://gitee.com/XiaoHeiDeXueXiZuZhi/part3-code
*/